package service

import (
	"errors"
	"lsgfish/server/internal/dto/request"
	"lsgfish/server/internal/dto/response"
	"lsgfish/server/internal/model"
	"lsgfish/server/internal/repo"
	"lsgfish/server/internal/tool"
)

// UserService 用户服务接口
type UserService interface {
	// 用户基本信息相关方法
	GetUserInfo(user *model.User) error
	ChangePassword(user model.User) error
	GenerateInviteCode(user *model.User) error
	Login(req *model.User) (string, error)

	// 用户管理相关方法
	PaginationList(params request.UserPaginationParams) (response.UserPaginationResult, error)
	Add(user model.User) error
	Update(user model.User) error
	Delete(id int) error
}

type userService struct {
	userRepo repo.UserRepository
}

// 创建用户服务
func NewUserService() UserService {
	return &userService{
		userRepo: repo.NewUserRepository(),
	}
}

// 生成用户邀请码
func (s *userService) GenerateInviteCode(user *model.User) error {
	if code, err := tool.GenerateInviteCode(); err != nil {
		return err
	} else {
		user.InviteCode = code
		if err := s.userRepo.Updates(*user); err != nil {
			return err
		}
	}
	return nil
}

// 修改密码
func (s *userService) ChangePassword(user model.User) error {
	return s.userRepo.Updates(user)
}

// 实现用户登录
func (s *userService) Login(req *model.User) (string, error) {
	user, err := s.userRepo.Query(req.Account)
	if err != nil {
		return "", err
	}

	// 验证密码
	if !tool.ComparePasswords(user.Password, req.Password) {
		return "", errors.New("密码错误")
	}
	// 查询token是否存在，如果存在则删除旧token缓存
	if user.Token != "" {
		tool.RedisServiceTool.DeleteToken(user.Token)
	}
	token, err := generatorToken(s.userRepo, user)
	return token, err
}

// 生成token并更新数据，和缓存
func generatorToken(userRepo repo.UserRepository, user model.User) (string, error) {
	// 生成token
	token, err := tool.GenerateToken(user)
	if err != nil {
		return "", errors.New("生成token失败")
	}
	user.Token = token
	// 保存token到Redis
	if err := tool.RedisServiceTool.SetToken(token, user); err != nil {
		return "", errors.New("保存token失败")
	}

	// 保存到数据库
	if err := userRepo.Updates(user); err != nil {
		tool.RedisServiceTool.DeleteToken(token)
		return "", errors.New("存储token失败")
	}
	return token, nil
}

// 获取用户信息
func (s *userService) GetUserInfo(user *model.User) error {
	// TODO:后期需要根据token获取用户信息，权限等，现在在redis中存储了token，所以直接获取token中的用户信息
	_, err := s.userRepo.Query(user.Account)
	return err
}

// 用户分页查询
func (s *userService) PaginationList(params request.UserPaginationParams) (response.UserPaginationResult, error) {
	return s.userRepo.PaginationList(params)
}

// 添加用户
func (s *userService) Add(user model.User) error {
	return s.userRepo.Add(user)
}

// 修改用户信息
func (s *userService) Update(user model.User) error {
	return s.userRepo.Update(user)
}

// 删除用户
func (s *userService) Delete(id int) error {
	return s.userRepo.Delete(id)
}
